package tripmaker

import eventos._
import Moneda.USD
import movimientos._
import Pais._
import Territorio._

import org.joda.time.LocalDate

case class Día(año: Option[Int], mes: Option[Int], día: Option[Int], eventos: Seq[Evento], actividades: Seq[Actividad]) {

  lazy val costoUSD = Monto(eventos.map { _.costo.inUSD.valor }.sum, USD)
  
  lazy val países: Seq[Pais] = (eventos flatMap { _.territorio.map { _.país } }).distinct
  
  def eventosConTerritorios: Seq[(Territorio, Evento)] = 
    Viaje.eventosConTerritorios(eventos, territorio.getOrElse(NingunLado))
  
  lazy val costosLocales = países map { p => Viaje.costoLocal(eventosConTerritorios.filter { _._1.país == p }.unzip._2, p) }
  lazy val costoExtranjero = Viaje.costoExtranjero(eventos, países: _*)
  lazy val costos = costosLocales ++ (if(costoExtranjero.valor != 0) Seq(costoExtranjero) else Nil)
  
  lazy val fecha = for(a <- año; m <- mes; d <- día) yield new LocalDate(a, m, d)
  
  lazy val territorios = eventos.flatMap { _.territorio } 
  lazy val territorio = territorios.headOption
  lazy val país = territorio map { _.país }

  override def toString: String = {
    (año.getOrElse("") + "-" + mes.getOrElse("") + "-" + día.getOrElse("")) + "\n" +
      (eventos map { "- " + _.toString } mkString "\n") + "\n"
  }
}